
The thing that struck me the most is how much better OCaml is for writing compilers than classical procedural programming languages.
That being said, there seems to be many things I have find frustrating about OCaml.  It can often be difficult to debug compile errors because partial function applications are allowed.  For example, it took me about 4 hours to discover that a bug that I was getting was due ``-1'' being interpreted as two arguments, a function and an integer.  I needed to use ``(-1)'' to fix the bug.

In order to utilize OCaml most efficiently and to reduce duplicate code, more thought needs to be put into the structure of data than other languages (although perhaps less than the case of complex inheritance situations).  One simple example is using ``Binop'' to express all binary expressions so that a single function can often handle all cases.  Also if two data structures share a common set of variables, such as activation and kernel functions, then delegating these variables to another type can a single function to be written to process this data rather than two.

I should have gotten the CheckFail() function in the testall.sh script to work sooner than what I did.  As a result, most of my tests are just check for successful results.  Having a test suite helped me on several occasions avoid messing up functionality that previously worked.  This was helpful because often the early tests could be achieved with simplifying assumptions that would later require more logic.

Overall, it seemed easier to develop my own language than what I had previously thought.  After getting the initial version up and running, new functionality could generally be added in a day.  Even fairly significant refactoring was fairly easy.